/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package fase2.pt.iul.sid.controller;

import fase2.pt.iul.sid.database.ComentarioAoEstabelecimentoDAO;
import fase2.pt.iul.sid.database.ComentarioAoPratoDAO;
import fase2.pt.iul.sid.database.EstabelecimentoDAO;
import fase2.pt.iul.sid.database.FactoryConnection;
import fase2.pt.iul.sid.database.FotografiaDAO;
import fase2.pt.iul.sid.database.PratoDAO;
import fase2.pt.iul.sid.database.UtilizadorDAO;
import fase2.pt.iul.sid.model.ComentarioAoEstabelecimentoModel;
import fase2.pt.iul.sid.model.ComentarioAoPratoModel;
import fase2.pt.iul.sid.model.EstabelecimentoModel;
import fase2.pt.iul.sid.model.FotografiaModel;
import fase2.pt.iul.sid.model.PratoModel;
import fase2.pt.iul.sid.model.UtilizadorModel;
import fase2.pt.iul.sid.view.Fotografia;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption.*;
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

import api.APINotificacoes;

/**
 *
 * @author Ricardo Marques
 */
public class FotografiaController {
    
    private String PATH_FOTOS_LOCATION = null;
    private FactoryConnection fc = null;
    private Fotografia fotografiaView = null;
    private String email_user_logon = null;
    private int typeDysplay = 0;
    private int bck_Id = 0;
    private String bck_String = "";
	private APINotificacoes APInotificacoes;
    
    public FotografiaController(FactoryConnection fc, String PATH_FOTOS_LOCATION, String email_user_logon){
        this.PATH_FOTOS_LOCATION = PATH_FOTOS_LOCATION;
        this.fc=fc;
        this.email_user_logon=email_user_logon;
    }
    
    public void mostrarFotosPrato(int id_prato){
        
        typeDysplay = 2;
        bck_Id = id_prato;

        FotografiaDAO fd = new FotografiaDAO(fc , PATH_FOTOS_LOCATION);
        
        //veriffica se o utilizador logado tem um comentario para o estabelecimento
        ComentarioAoPratoDAO ed = new ComentarioAoPratoDAO(fc);
        ComentarioAoPratoModel c = ed.getComentarioPrato(id_prato, email_user_logon);

        fotografiaView = new Fotografia();
        
        if(c==null){
            fotografiaView.getjButton1().setEnabled(false);
        }else{
            fotografiaView.getjButton1().setEnabled(true);
        }
        
        //por nome do prato na view
        PratoDAO p = new PratoDAO(fc);
        PratoModel prato = p.getPrato(id_prato);
        fotografiaView.getjLabel1().setText(fotografiaView.getjLabel1().getText()+" prato "+prato.getDescricao()); 
        
        fotografiaView.mostrar(fd.getFotosPrato(id_prato), email_user_logon);
        
        fotografiaView.addBtnActionLister(new ListnerBtns());
        
        
    }
    
    
    public void mostrarFotosEstabelecimento(int id_estabelecimento){
        
        typeDysplay = 1;
        bck_Id = id_estabelecimento;
                
        FotografiaDAO fd = new FotografiaDAO(fc , PATH_FOTOS_LOCATION);
        
        //veriffica se o utilizador logado tem um comentario para o estabelecimento
        ComentarioAoEstabelecimentoDAO ed = new ComentarioAoEstabelecimentoDAO(fc);
        ComentarioAoEstabelecimentoModel c = ed.getComentarioEstabelecimento(id_estabelecimento, email_user_logon);

        fotografiaView = new Fotografia();
        
        if(c==null){
            fotografiaView.getjButton1().setEnabled(false);
        }else{
            fotografiaView.getjButton1().setEnabled(true);
        }

        //por nome do estabelecimento na view
        EstabelecimentoDAO e = new EstabelecimentoDAO(fc);
        EstabelecimentoModel estabelecimento = e.getEstabelecimento(id_estabelecimento);
        fotografiaView.getjLabel1().setText(fotografiaView.getjLabel1().getText()+" estabelecimento "+estabelecimento.getDesignacao()); 
        
        fotografiaView.mostrar(fd.getFotosEstabelecimento(id_estabelecimento), email_user_logon);
        
        this.fotografiaView.addBtnActionLister(new ListnerBtns());
        
    }
    
    public void mostrarFotoPerfil(String email_user){
        
        typeDysplay = 3;
        bck_String = email_user;
        
        UtilizadorDAO u = new UtilizadorDAO(fc);
        UtilizadorModel um = u.getDadosUtilizador(email_user);
        
        FotografiaDAO fd = new FotografiaDAO(fc , PATH_FOTOS_LOCATION);
        
        fotografiaView = new Fotografia();
        
        List<FotografiaModel> lista = new LinkedList<>();
        lista.add(fd.getFotoPerfil(email_user));
        fotografiaView.mostrar(lista, email_user_logon);
        
        //por nome do utilizador na view
        fotografiaView.getjLabel1().setText(fotografiaView.getjLabel1().getText()+" perfil de "+um.getNome()); 
        
        fotografiaView.addBtnActionLister(new ListnerBtns());
        
        fotografiaView.getjButton1().setEnabled(true);
        
    }
    
    public String getCaminhoFoto(String email_user){
    	 typeDysplay = 3;
         bck_String = email_user;
         
         UtilizadorDAO u = new UtilizadorDAO(fc);
         UtilizadorModel um = u.getDadosUtilizador(email_user);
         
         FotografiaDAO fd = new FotografiaDAO(fc , PATH_FOTOS_LOCATION);
         
         
         try{
        	 return fd.getFotoPerfil(email_user).getLocalizacao();
         }catch (Exception e) {
        	 return "Fotosestabelecimentosutilizadores/noFoto.jpg";
		}
    }
    
    public void adicionarFotoPrato(Image foto){
        
    }
    
    public void adicionarFotoEstabelecimento(Image foto){
        
    }
    
    public void adicionarFotoPerfil(Image foto){
        
    }
    
    public void apagarFoto(int id_foto){
        
        FotografiaDAO fd = new FotografiaDAO(fc, PATH_FOTOS_LOCATION);
        if(fd.delete(id_foto)){
            fotografiaView.msgbox("Apagado com sucesso");
            
            if(typeDysplay==1){
                
                fotografiaView.dispose();
                mostrarFotosEstabelecimento(bck_Id);
                
            }else if(typeDysplay==2){
                
                fotografiaView.dispose();        
                mostrarFotosPrato(bck_Id);
                        
            }else if(typeDysplay==3){
                
                fotografiaView.dispose();
                mostrarFotoPerfil(bck_String);
                
            }else{
                        
            }
            
        }else{
            fotografiaView.msgbox("Não foi possivel realizar a operação");
        }
        
    }
    
    public void viewAddFotoPerfil(String email){
        mostrarFotoPerfil(email);
    }
    
    public void viewAddFotoPrato(int id_prato){
        mostrarFotosPrato(id_prato);
    }
    
    public void viewAddFotoEstabelecimento(int id_estabelecimento){
        mostrarFotosEstabelecimento(id_estabelecimento);
    }
    
    class ListnerBtns implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            
            
            if (e.getSource() == fotografiaView.getjButton1()) {
                
                fotografiaView.setFileUpload(new JFileChooser(){
                    @Override
                    public void approveSelection(){
                        File f = getSelectedFile();
                        if(f.exists() && getDialogType() == SAVE_DIALOG){
                            int result = JOptionPane.showConfirmDialog(this,"Tem a certeza que deseja eviar esta foto?","Upload file",JOptionPane.YES_NO_CANCEL_OPTION);
                            switch(result){
                                case JOptionPane.YES_OPTION:
                                    super.approveSelection();
                                    
                                    Path FROM = Paths.get(f.getAbsolutePath());
                                    Path TO = null;
                                    if(typeDysplay==1){
                                        TO = Paths.get(PATH_FOTOS_LOCATION + "estabelecimentos\\" + f.getName()) ;
                                    }else if(typeDysplay==2){
                                        TO = Paths.get(PATH_FOTOS_LOCATION + "pratos\\" + f.getName()) ;
                                    }else if(typeDysplay==3){
                                        TO = Paths.get(PATH_FOTOS_LOCATION + "utilizadores\\" + f.getName()) ;
                                    }else{
                                        
                                    }
                                    try {
                                        
                                        Files.copy(FROM, TO, REPLACE_EXISTING);
                                        
                                        FotografiaModel foto = new FotografiaModel( 0, TO.toString(), email_user_logon, "");
                                        
                                        FotografiaDAO fd = new FotografiaDAO(fc, PATH_FOTOS_LOCATION);
                                        
                                        if(typeDysplay==1){
                                            
                                            if(fd.adicionarFotoEstabelecimento(foto,email_user_logon,bck_Id)){
                                            
                                                fotografiaView.dispose();
                                                mostrarFotosEstabelecimento(bck_Id);
                                            
                                            }
                                            
                                        }else if(typeDysplay==2){
                                            
                                            if(fd.adicionarFotoPrato(foto,email_user_logon,bck_Id)){
                                            
                                                fotografiaView.dispose();
                                                mostrarFotosPrato(bck_Id);
                                            
                                            }
                                            
                                        }else if(typeDysplay==3){

                                            if(fd.adicionarFotoPerfil(foto, email_user_logon)){
                                            
                                                fotografiaView.dispose();
                                                mostrarFotoPerfil(bck_String);
                                            
                                            }
                                            
                                        }else{

                                        }
                                        
                                    } catch (IOException ex) {
                                        Logger.getLogger(FotografiaController.class.getName()).log(Level.SEVERE, null, ex);
                                    }

                                    return;
                                case JOptionPane.NO_OPTION:
                                    return;
                                case JOptionPane.CLOSED_OPTION:
                                    return;
                                case JOptionPane.CANCEL_OPTION:
                                    cancelSelection();
                                    return;
                            }
                        }
                        super.approveSelection();
                    }        
                });

                fotografiaView.getFileUpload().setFileSelectionMode(JFileChooser.FILES_ONLY);
                
                fotografiaView.getFileUpload().showSaveDialog(null);  
                
            }else if(e.getSource() == fotografiaView.getjButton2()){
                
                if(fotografiaView.getSelectedIdImage()!=0){
                    
                    apagarFoto(fotografiaView.getSelectedIdImage());
                  
                }
                
            }else{
                
            }
            
            try{
            	FotografiaController.this.APInotificacoes.fotoFoiAlterada();
            }catch (Exception ex) {
    			
    		}
        
        }
        
      
    }

	public void setAPINotificacoes(APINotificacoes notificacoes) {
		this.APInotificacoes = notificacoes;
		
	}
}
